package com.huiruan.controller.pc.sys;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huiruan.entity.SysRole;
import com.huiruan.service.SysRoleService;
import com.huiruan.utils.Result;
import com.huiruan.vo.RoleVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @author lengleng
 * @date 2019/2/1
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/pc/sysRole")
@Tag(name = "角色管理", description = "角色相关接口")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SysRoleController {

    private final SysRoleService sysRoleService;

    /**
     * 通过ID查询角色信息
     * @param id 角色ID
     * @return 包含角色信息的响应对象
     */
    @GetMapping("/details/{id}")
    public Result getById(@PathVariable Long id) {
        return Result.success(sysRoleService.getById(id));
    }

    /**
     * 查询角色详细信息
     * @param query 角色查询条件对象
     * @return 包含角色信息的响应结果
     */
    @GetMapping("/details")
    public Result getDetails(@ParameterObject SysRole query) {
        return Result.success(sysRoleService.getOne(Wrappers.query(query), false));
    }

    /**
     * 添加角色
     * @param sysRole 角色信息
     * @return 操作结果，成功返回success，失败返回false
     */
    //@SysLog("添加角色")
    @PostMapping
    //@HasPermission("sys_role_add")
    //@CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true)清楚缓存
    public Result saveRole(@Valid @RequestBody SysRole sysRole) {
        return Result.success(sysRoleService.save(sysRole));
    }

    /**
     * 修改角色信息
     * @param sysRole 角色信息
     * @return 操作结果，成功返回success，失败返回false
     */
    //@SysLog("修改角色")
    @PutMapping
    //@HasPermission("sys_role_edit")
    //@CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true)
    public Result updateRole(@Valid @RequestBody SysRole sysRole) {
        return Result.success(sysRoleService.updateById(sysRole));
    }

    /**
     * 根据ID数组删除角色
     * @param ids 角色ID数组
     * @return 操作结果
     */
    //@SysLog("删除角色")
    @DeleteMapping
    //@HasPermission("sys_role_del")
    //@CacheEvict(value = CacheConstants.ROLE_DETAILS, allEntries = true)
    public Result removeById(@RequestBody Long[] ids) {
        return Result.success(sysRoleService.removeRoleByIds(ids));
    }

    /**
     * 获取角色列表
     * @return 包含角色列表的响应结果
     */
    @GetMapping("/list")
    public Result listRoles() {
        return Result.success(sysRoleService.list(Wrappers.emptyWrapper()));
    }

    /**
     * 分页查询角色信息
     * @param page 分页对象
     * @param role 查询条件对象
     * @return 包含分页结果的响应对象
     */
    @GetMapping("/page")
    public Result getRolePage(Page page, SysRole role) {
        return Result.success(sysRoleService.page(page, Wrappers.<SysRole>lambdaQuery()
                .like(StrUtil.isNotBlank(role.getRoleName()), SysRole::getRoleName, role.getRoleName())));
    }

    /**
     * 更新角色菜单
     * @param roleVo 角色VO对象
     * @return 操作结果，成功返回success，失败返回false
     */
    //@SysLog("更新角色菜单")
//    @PutMapping("/menu")
//    //@HasPermission("sys_role_perm")
//    public Result saveRoleMenus(@RequestBody RoleVO roleVo) {
//        return Result.success(sysRoleService.updateRoleMenus(roleVo));
//    }

    /**
     * 通过角色ID列表查询角色信息
     * @param roleIdList 角色ID列表
     * @return 包含查询结果的响应对象
     */
    @PostMapping("/getRoleList")
    public Result getRoleList(@RequestBody List<Long> roleIdList) {
        return Result.success(sysRoleService.listRolesByRoleIds(roleIdList, CollUtil.join(roleIdList, StrUtil.UNDERLINE)));
    }
}
